package com.example.designhbwxz.book.service;

import com.example.designhbwxz.book.pojo.UserInfo;

import javax.servlet.http.HttpServletRequest;

/**
 * AbstractRegisterLoginComponent 抽象类
 *
 * @author shenzw
 * @date 2023/10/28
 */
public abstract class AbstractRegisterLoginComponent {

    /**
     * 面向接口变成，引入 RegisterLoginFuncInterface 接口属性，此处为“桥”之所在
     */
    protected RegisterLoginFuncInterface funcInterface;

    /**
     * 通过有参构造方法，初始化 RegisterLoginFuncInterface 类型，且不为 null
     *
     * @param funcInterface RegisterLoginFuncInterface
     */
    protected AbstractRegisterLoginComponent(RegisterLoginFuncInterface funcInterface) {
        // 校验构造方法入参为 RegisterLoginFuncInterface 这个类型，且不为 null
        validate(funcInterface);
        this.funcInterface = funcInterface;
    }

    /**
     * 校验参数类型为 RegisterLoginFuncInterface 这个类型，且不为 null，final 方法不允许子类重写1
     *
     * @param funcInterface RegisterLoginFuncInterface
     */
    protected final void validate(RegisterLoginFuncInterface funcInterface) {
        if (funcInterface == null) {
            throw new UnsupportedOperationException("Unknown register/login function type！");
        }
    }

    /**
     * 登陆
     *
     * @param userName 用户名
     * @param password 密码
     * @return String
     */
    public abstract String login(String userName, String password);

    /**
     * 注册
     *
     * @param userInfo 用户信息
     * @return String
     */
    public abstract String register(UserInfo userInfo);

    /**
     * 校验用户是否存在
     *
     * @param userName 用户名
     * @return boolean
     */
    public abstract boolean checkUserExists(String userName);

    /**
     * 第三方登陆
     *
     * @param request HttpServletRequest
     * @return String
     */
    public abstract String login3rd(HttpServletRequest request);

}
